﻿using System.Collections.Generic;
using Wedn.Core.Entity;

namespace Wedn.Interface.DAL
{
    /// <summary>
    /// 标签表操作类接口
    /// </summary>
    public interface ITerm
    {
        #region 增加记录
        /// <summary>
        /// 向标签表中插入一行新的数据, 返回插入数据的主键ID, 插入失败返回-1
        /// </summary>
        /// <param name="term">要插入的标签对象</param>
        /// <returns>返回插入数据的主键ID, 插入失败返回-1</returns>
        int Insert(Term term);

        /// <summary>
        /// 向标签表中批量插入多行新的数据, 返回插入数据的主键ID数组, 插入失败返回-1
        /// </summary>
        /// <param name="term">要插入的标签对象集合</param>
        /// <returns>返回插入数据的主键ID数组, 插入失败返回-1</returns>
        int[] Insert(List<Term> termList);
        #endregion

        #region 删除记录

        #region 删除一条
        /// <summary>
        /// 根据标签ID删除对应的标签记录, 返回执行结果受影响行数
        /// </summary>
        /// <param name="id">要删除记录的ID</param>
        /// <returns>执行结果受影响行数</returns>
        int Delete(int id);
        #endregion

        #region 删除多条
        /// <summary>
        /// 根据标签ID数组删除对应的标签记录, 返回执行结果受影响行数
        /// </summary>
        /// <param name="ids">要删除记录的ID数组</param>
        /// <returns>执行结果受影响行数</returns>
        int Delete(int[] ids);
        #endregion

        #endregion

        #region 更新记录

        #region 更新一个完整对象
        /// <summary>
        /// 更新一个完整的标签对象, 返回执行结果受影响行数
        /// </summary>
        /// <param name="term">要更新的对象</param>
        /// <returns>执行结果受影响行数</returns>
        int UpdateTerm(Term term);
        #endregion

        #region 更新常用字段

        /// <summary>
        /// 更新一个标签常用信息, 返回执行结果受影响行数
        /// </summary>
        /// <param name="id">标签ID</param>
        /// <param name="name">更新的名称(不更新则传入null)</param>
        /// <param name="slug">更新的别名(不更新则传入null)</param>
        /// <param name="parentId">更新的父ID(不更新则传入-1)</param>
        /// <param name="description">更新的描述(不更新则传入null)</param>
        /// <returns>执行结果受影响行数</returns>
        int UpdateInfo(int id, string name, string slug, int parentId, string description);

        /// <summary>
        /// 批量更新标签父ID
        /// </summary>
        /// <param name="ids">标签ID数组</param>
        /// <param name="parentId">更新的父ID</param>
        /// <returns></returns>
        int UpdateParentId(int[] ids, int parentId);

        /// <summary>
        /// 根据标签ID更新标签下项目数, 返回执行结果受影响行数
        /// </summary>
        /// <param name="id">要更新的标签ID</param>
        /// <param name="addCount">增加的数量(一般为1)</param>
        /// <returns>执行结果受影响行数</returns>
        int UpdateCount(int id, int addCount);

        /// <summary>
        /// 根据标签ID重新统计标签下项目数, 返回执行结果受影响行数
        /// </summary>
        /// <param name="id">要更新的标签ID</param>
        /// <returns>执行结果受影响行数</returns>
        int UpdateCount(int id);

        /// <summary>
        /// 重新统计标签下项目数, 返回执行结果受影响行数
        /// </summary>
        /// <returns>执行结果受影响行数</returns>
        int UpdateCount();
        #endregion

        #endregion

        #region 选取记录

        #region 选取表中主键最大值
        /// <summary>
        /// 获取表中主键最大值, 返回主键最大值
        /// </summary>
        /// <returns>主键最大值</returns>
        int SelectMaxId();
        #endregion

        #region 是否存在别名
        /// <summary>
        /// 检查表中是否已经存在该别名, 返回一个布尔值, 存在则为True; 不存在则为False
        /// </summary>
        /// <param name="slug">要确定的别名</param>
        /// <returns>存在返回True; 不存在返回False</returns>
        bool Exists(string slug);
        #endregion

        #region 选取标签总数
        /// <summary>
        /// 选取标签总数
        /// </summary>
        /// <param name="where">选择条件(忽略则传入null或空值)(不能使用参数, 要使用参数化写重载)</param>
        /// <returns>总数</returns>
        int SelectTermsCount(string where);
        #endregion

        #region 根据类型选取标签总数
        /// <summary>
        /// 根据类型选取标签总数
        /// </summary>
        /// <param name="termType">标签类型(0:post_tag, 1:post_category..)</param>
        /// <returns>总数</returns>
        int SelectTermsCountByType(int termType);
        #endregion

        #region 选取全部标签集合
        /// <summary>
        /// 取出当前标签表中的所有标签对象集合, 返回标签对象集合, 如果不存在则返回null
        /// </summary>
        /// <returns>标签对象集合</returns>
        List<Term> SelectTermList();
        #endregion

        #region 根据类型选取标签对象集合
        /// <summary>
        /// 根据类型选取标签对象集合, 如果不存在则返回null
        /// </summary>
        /// <param name="termType">标签类型(0:post_tag, 1:post_category..)</param>
        /// <returns>标签对象</returns>
        List<Term> SelectTermList(int termType);
        #endregion

        #region 根据类型和父ID选取标签对象集合
        /// <summary>
        /// 根据类型和父ID选取标签对象集合, 如果不存在则返回null
        /// </summary>
        /// <param name="termType">标签类型(0:post_tag, 1:post_category..)</param>
        /// <param name="parentId">父ID</param>
        /// <returns>标签对象</returns>
        List<Term> SelectTermList(int termType, int parentId);
        #endregion

        #region 根据文章对象ID选取标签对象集合
        /// <summary>
        /// 根据对象ID和类型选取标签对象集合, 如果不存在则返回null
        /// </summary>
        /// <param name="objectId">对象ID</param>
        /// <param name="objectType">对象类型(0:Post, 1:User, 2:Link, 3:Comment)</param>
        /// <returns>标签对象</returns>
        List<Term> SelectTermListByObject(int objectId, int objectType);
        #endregion

        #region 根据ID选取标签对象
        /// <summary>
        /// 根据ID选取标签对象, 如果不存在则返回null
        /// </summary>
        /// <param name="termid">标签ID</param>
        /// <returns>标签对象</returns>
        Term SelectTerm(int termid);
        #endregion

        #region 根据别名选取标签对象
        /// <summary>
        /// 根据ID和类型选取标签对象, 如果不存在则返回null
        /// </summary>
        /// <param name="slug">标签别名</param>
        /// <returns>标签对象</returns>
        Term SelectTerm(string slug);
        #endregion

        #endregion
    }
}
